[U] extends ..でdistributeを避ける
U自体がUnion型でないと分配されない
U extends ..は、分配される
U[] extends ..は、分配されない
[U] extends ..は、分配されない
この仕様は、「意図的に、Union型を分配させたくない」という時に用いられる
例えばこんな型があるとき、
code:ts
type Dist<U> = U[] extends string[] | number[] ? true : false;
これ↓の結果は、trueか?falseか?
code:ts
type R = Dist<string | number>; // true or false
以下の2パターン考えられる
もし分配されるならtrueになるはず
code:ts
type R = Dist<string | number>;
= string[] extends string[]|number[] ? true : false
| number[] extends string[]|number[] ? true : false
= true | true
= true
分配されないならfalseになるはず
code:ts
type R = Dist<string | number>;
= (string|number)[] extends string[]|number[] ? true : false
= false
実際は、falseになる
つまり、分配されない
[U]のときも同様
この知識が必要とされる型の実装例